#include "HojaArbolB.h"

void HojaArbolB::BajarMayor(Informacion *dato)
{
	informacion.push_back(dato);
}



void HojaArbolB::BajarMenor(Informacion *dato)
{
	informacion.insert(informacion.begin(),dato);
}



void HojaArbolB::SubirMayor(Informacion* &dato)
{
	if(informacion.size()==0)
	{
		dato=NULL;
		return;
	}
	dato=informacion[informacion.size()-1];
	informacion.pop_back();

}



std::vector<Informacion*> HojaArbolB::Buscar(Clave* dato)
{
	std::vector<Informacion*> datos;
	int i;
	for( i=0; (unsigned int)i < informacion.size();  i++)
	{

		if(dato->Comparar(informacion[i]->GetClave())==0)
		{
			datos.push_back(informacion[i]);
		}
	}


	return datos;
}

HojaArbolB::~HojaArbolB()
{
	for(std::vector<Informacion*>::iterator it=informacion.begin(); it != informacion.end(); ++it)
	{
		delete *it;
	}

}



bool HojaArbolB::Ingresar(Informacion *dato)
{
	bool error=false;
	int i;
	for( i=0; (unsigned int)i < informacion.size();  i++)
	{
		if(dato->Comparar(informacion[i])<0)
		{
			//salgo cuando encuentro la primer clave menor
			break;
		}

		if(dato->Comparar(informacion[i]->GetClave())==0)
		{
			throw IndexException();
		}
	}

	//lo agrego al siguiente
	informacion.insert(informacion.begin()+i, new Informacion(*dato));

	error= informacion.size()==(unsigned int)cantidadClaves+1;

	return error;

}

bool HojaArbolB::EsHoja()
{
	return true;
}



bool HojaArbolB::Quitar(Informacion *dato)
{
	bool error=false, encontrado=false;
	int i;
	for( i=0; (unsigned int)i < informacion.size();  i++)
	{
		if(dato->Comparar(informacion[i]->GetClave())==0)
		{
			//salgo cuando encuentro la primer clave menor
			encontrado=true;
			break;
		}
	}

	//lo quito del siguiente
	if(encontrado)
		informacion.erase(informacion.begin()+i);


	error= informacion.size()< (unsigned int)(cantidadClaves * 2/3);

	return error;
}



void HojaArbolB::MayorClave(Clave* &dato)
{
	if(informacion.size())
	dato=informacion[informacion.size()-1]->GetClave();
	else
	dato=NULL;
}

HojaArbolB::HojaArbolB(int cantidadClaves): ComponenteArbolB(cantidadClaves)
{
	for(std::vector<Informacion*>::iterator it=informacion.begin(); it != informacion.end(); ++it)
	{
		*it=NULL;
	}

}



void HojaArbolB::SubirMenor(Informacion *& dato)
{
	if(informacion.size()==0)
	{
		dato=NULL;
		return;
	}
	dato=informacion[0];
	informacion.erase(informacion.begin());
}

